
04.11.2014, 15:00
|
Новичок на форуме
|
|
Регистрация: 12.01.2014
Сообщений: 6
|
|
Node & Websockets - посылка значений в бесконечном цикле
День добрый!
В JS и прочих ЯВУ писал ранее только линейно, Node стал испытанием при решении простейшей задачки:
1. Пользователь открывает рамочную страницу, при установке коннекта через WS ему дают первую порцию данных из базы (getValuesFull). На той стороне данные парсят и выводят.
2. Каждые пять секунд вычисляется разница на стороне сервера и передается через WS в браузер эта самая дельта(getValues). В клиенте данные парсятся и выводятся как и в п.1
Это всё что надо, только одна функция у WS.
Опостылевший пожалуй уже всем пример чата запилил под себя, mysql подсоединил, написал процедуры и сделал кнопку "обновить" в браузере(была в примерчике "Отправить"), при её нажатии всё прилетает как надо.
В конце кода в комментариях моё видение вопроса с бесконечным циклом, но оно не работает, либо сразу в цикл, либо +1 клиент и тоже туда и выхода нет оттуда, обновления не ходят и лог не пишет.
Подскажите, как эту кнопку "нажимать" на сервере каждые 5 секунд, а то если все клиенты будут со стороны браузера дергать будет совсем некрасиво и тяжело для базы.
Заранее спасибо!
var WebSocketServer = new require('ws');
// подключенные клиенты
var clients = {};
var clientsCount = 0;
var mysql = require('mysql');
var mysqlConnection = mysql.createConnection({
database : '***',
user : '***',
password : '***',
stringifyObjects : true,
socketPath : '/tmp/mysql.sock'
});
// WebSocket-сервер на порту 8081
var webSocketServer = new WebSocketServer.Server({port: 8081});
webSocketServer.on('connection', function(ws) {
var id = Math.random();
clients[id] = ws;
clientsCount++;
console.log("new connect " + id + ', total ' + clientsCount);
getValuesFull(sendBroadcast);
ws.on('message', function(message) {
getValues(sendBroadcast);
});
ws.on('close', function() {
clientsCount--;
console.log('connection is closed ' + id + ', total ' + clientsCount);
delete clients[id];
});
});
function sendBroadcast(newValues_){
for(var key in clients) {
clients[key].send(newValues_);
};
};
function getValues(callback){
strQuery = "call getValues";
mysqlConnection.query( strQuery, function(err, rows){
if(err) {
throw err;
}else{
try{
callback(rows[0][0]['value']);
}catch(e){
}
}
});
};
function getValuesFull(callback){
strQuery = "call getValuesFull";
mysqlConnection.query( strQuery, function(err, rows){
if(err) {
throw err;
}else{
try{
callback(rows[0][0]['value']);
}catch(e){
}
}
});
};
function sleep(milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
};
//while(1){
//if(clientsCount){
// getValues(sendBroadcast);
// sleep(5000);
//};
//};
|
|

04.11.2014, 15:10
|
 |
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,596
|
|
setTimeout\setInterval
Судя по всему вы пока не разбираетесь в самой парадигме js, зачем вам node?
__________________
29375, 35
|
|

04.11.2014, 15:27
|
Новичок на форуме
|
|
Регистрация: 12.01.2014
Сообщений: 6
|
|
Пробовал и так, получал на первом же интервале ошибку:
setInterval(getValues(sendBroadcast), 5000);
new connect 0.09275826113298535, total 1
timers.js:261
callback.apply(this, args);
^
TypeError: Cannot call method 'apply' of undefined
at wrapper [as _onTimeout] (timers.js:261:14)
at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)
Как таковой Node не нужен, гуру в нём становится мне поздно, просто решение вопроса на нём наиболее простое на мой взгляд, масса модулей для расширения функционала.
Есть ли у вас пример именно чарта/графика/диаграммы обновлямый с сервера?
|
|

04.11.2014, 15:36
|
 |
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,596
|
|
Само собой. Вы пихаете в setInterval значение возвращённое функцией getValues(sendBroadcast). В вашем случае функция ничего не возвращает, получается undefined. Т.е. то, что вы написали эквивалентно:
setInterval(undefined, 5000);
Следует завернуть в анонимную функцию:
setInterval(function(){
getValues(sendBroadcast)
}, 5000);
или, если передача параметра не требуется, то передавать саму функцию:
setInterval(getValues, 5000);
Это тоже вопрос понимания самого базового javascript, безотносительно к конкретным node и setInterval.
Пишите на php, если привыкли - там давно имеются библиотеки для работы с вебсокетами, да и с хостингом куда проще.
__________________
29375, 35
Последний раз редактировалось Aetae, 04.11.2014 в 15:44.
|
|

04.11.2014, 16:31
|
 |
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Если проблема с пониманием колбеков, то ...
В ES7 добавят async и await, а пока можно юзать похожий функционал на генераторах:
https://www.npmjs.org/package/co
co(function *(){
var a = yield get('http://google.com');
var b = yield get('http://yahoo.com');
var c = yield get('http://cloudup.com');
console.log(a[0].statusCode);
console.log(b[0].statusCode);
console.log(c[0].statusCode);
})()
Всё асинхронно, но никаких колбеков и нормальная обработка ошибок 
|
|

04.11.2014, 16:44
|
 |
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,596
|
|
kobezzza, ну не знаю, мож конечно тому кто привык к "обычным" языкам, это и будет сразу удобно и понятно, но имхо скорее окончательно снесёт крышу. 
__________________
29375, 35
|
|

04.11.2014, 16:50
|
 |
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от Aetae
|
kobezzza, ну не знаю, мож конечно тому кто привык к "обычным" языкам, это и будет сразу удобно и понятно, но имхо скорее окончательно снесёт крышу.
|
Во многих языках так сделана асинхронность: C#, Go и т.д. т.к. такой подход более удобный, чем колбеки и поэтому в ES7 добавят такую фичу из коробки
async {
var a = await get('http://google.com');
var b = await get('http://yahoo.com');
var c = await get('http://cloudup.com');
console.log(a[0].statusCode);
console.log(b[0].statusCode);
console.log(c[0].statusCode);
}
Как то так 
|
|

04.11.2014, 17:08
|
 |
Профессор
|
|
Регистрация: 23.12.2013
Сообщений: 1,856
|
|
kobezzza,
это очешуенно, на самом деле. Но. Когда? Опять через 1-2 года появится? В ночнушках каких-нибудь. А нам потом код переписывать ;( Опять.
|
|

04.11.2014, 17:14
|
 |
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от Safort
|
kobezzza,
это очешуенно, на самом деле. Но. Когда? Опять через 1-2 года появится? В ночнушках каких-нибудь. А нам потом код переписывать ;( Опять.
|
Судьба у нас такая  С другой стороны, в некоторых языках, транслируемых в JS такая штука давно уже есть.
|
|

04.11.2014, 20:19
|
Новичок на форуме
|
|
Регистрация: 12.01.2014
Сообщений: 6
|
|
О, вот это самое толковое объяснение ситуации! Нигде не написано, как именно передавать аргументы в функцию, обёртка обычно рассматривается для функций без аргументов.
Php не использую, считаю недоязыком и свалкой всего и вся, уважаю ASM, Perl, SQL в разных ипостасиях. Да, в те дремучие времена знакомства с JS про асинхронность у него как-то было совсем ничего  .
И таки да, благодаря помощи вашей - всё заработало как надо, спасибо!
|
|
|
|